// 云函数入口文件
const axios = require("axios");
const cloud = require("wx-server-sdk");

// 初始化云函数
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV });

// 云函数入口函数
exports.main = async (event, context) => {
  console.log("云函数调用参数:", event);

  try {
    // 从环境变量获取Coze API配置
    const token = process.env.TOKEN;
    const workflowId = process.env.WORKFLOW_ID;

    console.log(
      "环境变量检查: TOKEN存在?",
      !!token,
      ", WORKFLOW_ID存在?",
      !!workflowId
    );
    console.log("WORKFLOW_ID:", workflowId);

    if (!token || !workflowId) {
      throw new Error("环境变量配置错误：缺少TOKEN或WORKFLOW_ID");
    }

    // 获取用户输入
    const { text, type } = event;

    if (!text) {
      throw new Error("缺少必要参数：text");
    }

    console.log("处理请求: 文本=", text, ", 类型=", type);

    // 根据不同的图片类型设置style参数
    let style = "";
    switch (type) {
      case "person":
        style = "人像";
        break;
      case "anime":
        style = "动漫";
        break;
      case "general":
      default:
        style = "通用";
        break;
    }

    console.log("转换后的图片风格:", style);

    // 调用Coze API
    const imageUrl = await callCozeAPI(token, workflowId, text, style);

    console.log("成功获取图片URL:", imageUrl);

    // 返回生成的图片URL
    return {
      success: true,
      imageUrl: imageUrl,
      message: "图片生成成功",
    };
  } catch (error) {
    console.error("生成图片失败:", error);

    // 构建更详细的错误响应
    return {
      success: false,
      error: error.message || "图片生成失败，请重试",
      stack: process.env.NODE_ENV === "development" ? error.stack : undefined,
      details: error.details || undefined,
    };
  }
};

/**
 * 调用Coze API生成图片
 * @param {string} token - Coze API令牌
 * @param {string} workflowId - 工作流ID
 * @param {string} inputPrompt - 输入提示词
 * @param {string} style - 图片风格
 * @returns {Promise<string>} - 返回生成的图片URL
 */
async function callCozeAPI(token, workflowId, inputPrompt, style) {
  console.log("准备调用Coze API...");

  try {
    // 设置API基础URL
    const baseURL = "https://api.coze.cn";

    // 设置请求头
    const headers = {
      "Content-Type": "application/json",
      Authorization: `Bearer ${token}`,
    };
    console.log("Coze API请求headers", headers);

    // 构建请求体
    const requestBody = {
      workflow_id: workflowId,
      parameters: {
        inputPrompt: inputPrompt,
        style: style,
      },
    };

    console.log("Coze API请求参数:", JSON.stringify(requestBody, null, 2));

    // 发送请求到Coze API接口
    console.log("开始发送请求到:", `${baseURL}/v1/workflow/run`);
    const response = await axios.post(
      `${baseURL}/v1/workflow/run`,
      requestBody,
      { headers }
    );

    console.log("请求成功，开始处理响应...");

    // 处理响应
    if (!response.data) {
      throw new Error("API响应为空");
    }

    console.log("API响应类型:", typeof response.data);
    if (typeof response.data === "object") {
      console.log(
        "API响应预览:",
        JSON.stringify(response.data).substring(0, 300) + "..."
      );
    } else {
      console.log("API响应预览:", response.data.substring(0, 300) + "...");
    }

    // 根据示例返回结构: {"code":0,"cost":"0","data":"{\"data\":\"https://s.coze.cn/t/UxPi34gbqXc/\"}","debug_url":"...","msg":"Success","token":80}
    if (response.data.code === 0 && response.data.data) {
      console.log("收到Coze API成功响应，code=0");

      let dataContent = response.data.data;

      // 如果data是字符串形式的JSON，则解析它
      if (typeof dataContent === "string") {
        try {
          console.log("解析data字符串为JSON对象");
          dataContent = JSON.parse(dataContent);
          console.log("解析后的data:", dataContent);
        } catch (e) {
          console.log("data不是有效的JSON字符串，按原样处理");
        }
      }

      // 提取图片URL
      let imageUrl = "";

      // 如果data是对象且包含data字段，该字段就是URL
      if (dataContent && dataContent.data) {
        console.log("从data.data中提取URL");
        imageUrl = dataContent.data;
      }
      // 如果data直接就是URL字符串
      else if (
        typeof dataContent === "string" &&
        dataContent.includes("http")
      ) {
        console.log("data直接是URL字符串");
        imageUrl = dataContent;
      }

      if (imageUrl) {
        console.log("成功从非流式接口提取图片URL:", imageUrl);
        return imageUrl;
      }
    }

    // 如果无法通过标准结构提取URL，尝试使用旧的方法作为备选
    console.log("标准提取失败，尝试备选方法");

    let imageUrl = "";

    // 尝试流式接口格式(旧方法，兼容性保留)
    if (
      response.data.stream_items &&
      Array.isArray(response.data.stream_items)
    ) {
      console.log("尝试以流式项目格式解析响应...");
      for (const item of response.data.stream_items) {
        if (
          item.content &&
          item.content.images &&
          item.content.images.length > 0
        ) {
          console.log("在content.images中找到图片URL");
          imageUrl = item.content.images[0].url;
          break;
        } else if (item.image_urls && item.image_urls.length > 0) {
          console.log("在image_urls中找到图片URL");
          imageUrl = item.image_urls[0];
          break;
        } else if (item.image_url) {
          console.log("在image_url中找到图片URL");
          imageUrl = item.image_url;
          break;
        }
      }
    } else if (response.data.image_url) {
      console.log("在响应根级别找到image_url");
      imageUrl = response.data.image_url;
    } else if (
      typeof response.data === "string" &&
      response.data.includes("http")
    ) {
      console.log("响应是包含URL的字符串");
      imageUrl = response.data.trim();
    }

    if (!imageUrl) {
      console.error("未能在响应中找到图片URL");
      console.error("完整响应内容:", JSON.stringify(response.data));
      throw Object.assign(new Error("未能从API响应中提取到图片URL"), {
        details: { responseData: response.data },
      });
    }

    console.log("成功提取到图片URL:", imageUrl);
    return imageUrl;
  } catch (error) {
    console.error("API调用失败:", error.message);

    // 如果有详细的错误信息，则优先使用
    if (error.response) {
      console.error("错误状态码:", error.response.status);
      console.error("错误响应头:", JSON.stringify(error.response.headers));
      console.error(
        "错误响应数据:",
        typeof error.response.data === "object"
          ? JSON.stringify(error.response.data)
          : error.response.data
      );

      throw Object.assign(
        new Error(
          `API调用失败[${error.response.status}]: ${
            typeof error.response.data === "string"
              ? error.response.data
              : JSON.stringify(error.response.data)
          }`
        ),
        {
          details: {
            responseData: error.response.data,
            status: error.response.status,
          },
        }
      );
    }

    throw error;
  }
}
